﻿Imports PTIC_GestionExcel
Imports PTIC_GestionBDD
Imports PTIC_Util
Imports Microsoft.Office.Interop
Imports Actuariat
Imports OMANE.moteurTauxGaranti1

Public Class frmResultatsModele1
    Implements PTIC_Util.IObserver

#Region "Variables de classe"

    'Objets métier et contrôleur
    Protected _universBDD As UniversOMANE
    Protected _controleurOMANE As Controleur
    Protected _moteurCalcul As Moteur_Methode1

    'Variables/objets de la vue
    Protected _ongletCalculsDetaillesScenCentral As TabPage
    Protected _ongletSensibilites As TabPage
    Protected _ongletStressTests As TabPage
    Protected _ongletSynthese As TabPage
    Protected _parametrageEnCours As Boolean
    Protected _bln_actualiseModele As Boolean = True
    Protected _bln_actualiseTextBox As Boolean = True
    Protected _TxtPrecPosCurseur As Integer
#End Region

#Region "Création d'une instance"
    Public Sub New(ByVal univers As UniversOMANE, _
                   ByVal controleur As Controleur)

        ' Cet appel est requis par le Concepteur Windows Form.
        InitializeComponent()

        Me._universBDD = univers
        _controleurOMANE = controleur

        _ongletCalculsDetaillesScenCentral = Me.tbp_ResCalculsDetailles
        _ongletSensibilites = Me.tbp_ResSensibilitesSim
        _ongletStressTests = Me.tbp_ResStressTests
        _ongletSynthese = Me.tbp_ResSensibilitesRad

        refreshVisibiliteAffichage()
        'Le graphique de jauge est masqué
        ''ZedGraphGauge.Visible = False
        ''PtiC_PanelGpeBoxSPscenCent.Visible = False
        ''Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxResScenMut, 3)

    End Sub
    Protected Overrides Sub OnLoad(ByVal e As System.EventArgs)
        MyBase.OnLoad(e)
        dgv_tbleTravail.ColumnHeadersDefaultCellStyle.Font = New System.Drawing.Font("Tahoma", 9.0!, System.Drawing.FontStyle.Bold)
        dgv_tbleTravail.RowHeadersDefaultCellStyle.Font = New System.Drawing.Font("Tahoma", 9.0!, System.Drawing.FontStyle.Bold)
        dgv_tbleTravail.DefaultCellStyle.Format = "#,##0"
        dgv_tbleTravail.DefaultCellStyle.Font = New System.Drawing.Font("Tahoma", 9.0!, System.Drawing.FontStyle.Regular)
        dgv_tbleTravail.ColumnHeadersDefaultCellStyle.Format = ""
        dgv_tbleTravail.RowHeadersDefaultCellStyle.Format = ""
    End Sub
#End Region

#Region "Modification du taux de commissionnement"

    Private Sub txtParam_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) _
        Handles txt_Param8.Validating

        'La valeur du paramètre stockée dans le modèle est égale à sa dernière valeur valide
        'Ici, on cherche à savoir s'il faut ou non mettre à jour le paramètre
        Dim txt_Param As PTIC_Composants_WF.PTIC_NumFormatedTextBox
        txt_Param = CType(sender, TextBox)
        Dim nomParametre As String = nomTx_CommiContA
        Dim result As resultatValidationContraintes = _
            _controleurOMANE.controleListeParametres.isValeurUniqueAfficheeValide(nomParametre, txt_Param.Text)

        If Not e.Cancel = True Then
            If Not result.isValide Then
                e.Cancel = True
                txt_Param.Select(0, txt_Param.Text.Length)
                ErrorProvider1.SetError(txt_Param, result.msg)
            End If
        End If
    End Sub
    Private Sub txtParam_Validated(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles txt_Param8.Validated

        Dim txt_Param As PTIC_Composants_WF.PTIC_NumFormatedTextBox
        txt_Param = CType(sender, PTIC_Composants_WF.PTIC_NumFormatedTextBox)
        Dim nomParametre As String = nomTx_CommiContA

        _controleurOMANE.controleListeParametres.setValeurUniqueFromValeurAffichee(nomParametre, txt_Param.value)
    End Sub
#End Region

#Region "Onglet de résultat du scénario central"

    Private Sub btn_ExecuteCalculs_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_ExecuteCalculsScenCent.Click
        _controleurOMANE.executeCalculsModele1()
    End Sub
    Private Sub btn_calculSimulations_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_calculSimulations.Click
        _moteurCalcul = _controleurOMANE.executeSimulationsModele1()
    End Sub
    Private Sub btn_ExportEXCEL_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btn_ExportEXCEL.Click

        Dim SaveFileDialog1 As New SaveFileDialog
        SaveFileDialog1.InitialDirectory = csteEmplacementSorties
        SaveFileDialog1.Filter = "Fichiers Excel|*.xls;*.xlsx"

        If SaveFileDialog1.ShowDialog() = DialogResult.OK Then

            Dim b As Boolean
            Dim xlEtude As New gestionExcelTxGar1OMANE(b, _universBDD, _universBDD.ListeParametres)

            If b Then

                xlEtude.BeginMAJ()
                xlEtude.ExcelAffParamFichier()
                xlEtude.ExcelAffParamTranches()
                xlEtude.ExcelAffParamGeneraux()
                xlEtude.ExcelAffSegmentation()
                xlEtude.ExcelAffResDetaillesScenCentral()
                xlEtude.EndMAJ()
                xlEtude.EnregistrerSous(SaveFileDialog1.FileName)

            End If

        End If

    End Sub

#End Region

#Region "Onglets de Résultats sur les sensibilités"
    Private Sub tbp_ResSensibilitesSim_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles tbp_ResSensibilitesSim.Enter
        MAJ_graphsSensibilites()
    End Sub
    Private Sub tbp_ResStressTests_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles tbp_ResStressTests.Enter
        MAJ_graphsStressTests()
    End Sub
    Private Sub tbp_ResSensibilitesRad_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles tbp_ResSensibilitesRad.Enter
        MAJ_spiderGraph()
    End Sub
#End Region

#Region "Rafraichissements"
#Region "Redirection des demandes du modèle et du contrôleur"

    ''' <summary>
    ''' Récupération des actualisations demandées par le modèle
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="notification"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function actualise(ByVal sender As Object, ByVal notification As Object) As PTIC_Util.resultatValidationContraintes Implements PTIC_Util.IObserver.actualise
        If TypeOf sender Is Segmentation Then
            actualiseFromSegmentation(notification)
        End If
        If TypeOf sender Is IParamV2 Then
            Dim paramModifie As IParamV2 = sender
            Dim nomParametre As String = paramModifie.nom
            actualiseFromParam(nomParametre)
        End If
        If TypeOf sender Is Moteur_Methode1 Then
            actualiseFromMoteur1(notification)
        End If
        Return Nothing
    End Function

    ''' <summary>
    ''' Gestion des actualisations demandées par l'objet segmentation
    ''' </summary>
    ''' <param name="notification"></param>
    ''' <remarks></remarks>
    Private Sub actualiseFromSegmentation(ByVal notification As Object)

        Dim notifModifSegmentation As Segmentation.notification = notification.notification
        Dim lSegAmodifier As List(Of Correspondance) = notification.listeSegments

        Dim dicoListSegments As New Dictionary(Of String, Correspondance)
        For Each corresp As Correspondance In lSegAmodifier
            dicoListSegments.Add(corresp.description, corresp)
        Next

        If notifModifSegmentation = Segmentation.notification.ModifSegmentsRetenus Then
            Dim operation As operationCollection = notification.operation
            If operation = operationCollection.ADD Then
                refreshScCentListeSegmentation(dicoListSegments, operationCollection.ADD)
            End If
            If operation = operationCollection.REMOVE Then
                refreshScCentListeSegmentation(dicoListSegments, operationCollection.REMOVE)
            End If
        End If

    End Sub
    ''' <summary>
    ''' Gestion des actualisation demandées par les paramètres de l'étude
    ''' </summary>
    ''' <param name="nomParametre"></param>
    ''' <remarks></remarks>
    Private Sub actualiseFromParam(ByVal nomParametre As String)
        If nomParametre = csteParam.nomTx_CommiContA Then
            refreshScCentValeurUniqueTxCom(_controleurOMANE.controleListeParametres.getValeurUniqueAffichee(nomParametre))
        End If
    End Sub
    ''' <summary>
    ''' Gestion des actualisations en provenance du moteur de calcul
    ''' </summary>
    Private Sub actualiseFromMoteur1(ByVal notification As Moteur_Methode1.notification)
        If notification = Moteur_Methode1.notification.etatCalculScenCentralModif Then
            refreshVisibiliteAffichage()
            refreshScCentSommeMontantsAssu()
            refreshScCentCoutRisqueMutualise()
            refreshScCentSPrisqueMut()
            refreshScCentPrimeRisqueMutualisee()
            refreshScCentChargementTech()
            refreshScCentTableTravDetaillee()
            refreshScCentGaugeSP()
        End If
        If notification = Moteur_Methode1.notification.etatCalculSimulationsModif Then
            refreshVisibiliteAffichage()
        End If
    End Sub

#End Region

#Region "Rafraichissements élémentaires"
#Region "Rafraichissement des onglets liés au scénario central"
    Private Sub refreshVisibiliteAffichage()

        With _universBDD.listeTraitements.getTraitMoteurMethode1

            'Le scénario central n'est pas à jour
            If .etatCalculScenCentral = valueEtatCalcul.A_MAJ Or .etatCalculScenCentral = valueEtatCalcul.NON_INITIALISE Then
                With tbc_ImportEncours.TabPages
                    If .Contains(_ongletCalculsDetaillesScenCentral) Then .Remove(_ongletCalculsDetaillesScenCentral)
                    If .Contains(_ongletSensibilites) Then .Remove(_ongletSensibilites)
                    If .Contains(_ongletStressTests) Then .Remove(_ongletStressTests)
                    If .Contains(_ongletSynthese) Then .Remove(_ongletSynthese)
                End With
                'On masque les boutons de calcul d'une simulation et d'export Excel
                Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxResScenMut, 5)
                Me.PtiC_TableLayoutPanelResScenCent.Controls.Add(Me.btn_ExecuteCalculsScenCent, 3, 6)
                btn_ExecuteCalculsScenCent.Visible = True
                btn_ExportEXCEL.Visible = False
                btn_calculSimulations.Visible = False
                PtiC_PanelGpeBoxSPscenCent.Visible = False
                Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxResScenMut, 5)

                'Le scénario central est à jour mais pas les simulations
            ElseIf .etatCalculSimulations = valueEtatCalcul.A_MAJ Or .etatCalculSimulations = valueEtatCalcul.NON_INITIALISE Then
                With tbc_ImportEncours.TabPages
                    If Not .Contains(_ongletCalculsDetaillesScenCentral) Then .Add(_ongletCalculsDetaillesScenCentral)
                    If .Contains(_ongletSensibilites) Then .Remove(_ongletSensibilites)
                    If .Contains(_ongletStressTests) Then .Remove(_ongletStressTests)
                    If .Contains(_ongletSynthese) Then .Remove(_ongletSynthese)
                End With
                'Mettre la mutualisation sur une ligne de moins
                Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxResScenMut, 2)
                Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxSPscenCent, 2)
                Me.PtiC_TableLayoutPanelResScenCent.Controls.Add(Me.btn_ExportEXCEL, 3, 5)
                Me.PtiC_TableLayoutPanelResScenCent.Controls.Add(Me.btn_calculSimulations, 3, 6)
                btn_ExecuteCalculsScenCent.Visible = False
                btn_ExportEXCEL.Visible = True
                btn_calculSimulations.Visible = True
                PtiC_PanelGpeBoxSPscenCent.Visible = True

                'Le scénario central et les simulations sont à jour
            Else
                With tbc_ImportEncours.TabPages
                    If Not .Contains(_ongletCalculsDetaillesScenCentral) Then .Add(_ongletCalculsDetaillesScenCentral)
                    If Not .Contains(_ongletSensibilites) Then .Add(_ongletSensibilites)
                    If Not .Contains(_ongletStressTests) Then .Add(_ongletStressTests)
                    If Not .Contains(_ongletSynthese) Then .Add(_ongletSynthese)
                End With
                'Mettre la mutualisation sur une ligne de moins


                'Mettre la mutualisation sur une ligne de moins
                Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxResScenMut, 2)
                Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxSPscenCent, 3)
                Me.PtiC_TableLayoutPanelResScenCent.Controls.Add(Me.btn_ExportEXCEL, 3, 6)
                btn_ExecuteCalculsScenCent.Visible = False
                btn_ExportEXCEL.Visible = True
                btn_calculSimulations.Visible = False
                PtiC_PanelGpeBoxSPscenCent.Visible = True

            End If
        End With

    End Sub
#Region "La segmentation retenue"
    Private Sub refreshScCentListeSegmentation(ByVal dicoListSegments As Dictionary(Of String, Correspondance), ByVal operation As operationCollection)
        ltvFunc_modifCollCorresp(ltv_niveauSeg, dicoListSegments, operation)
    End Sub
#End Region
#Region "Les stats sur le portefeuille"
    Private Sub refreshScCentSommeMontantsAssu()
        Dim moteur1 As moteurTauxGaranti1.Moteur_Methode1 = _universBDD.listeTraitements.getTraitMoteurMethode1
        If moteur1.etatCalculScenCentral = valueEtatCalcul.A_JOUR Then
            PtiC_Lbl_sommeCapiAssu.Text = Format(moteur1.sommeCSR_ScenCentral, "###,### €")
        Else
            PtiC_Lbl_sommeCapiAssu.Text = "-"
        End If
    End Sub
    Private Sub refreshScCentCoutRisqueMutualise()

        Dim moteur1 As moteurTauxGaranti1.Moteur_Methode1 = _universBDD.listeTraitements.getTraitMoteurMethode1
        If moteur1.etatCalculScenCentral = valueEtatCalcul.A_JOUR Then
            PtiC_Lbl_coutRisqueMut.Text = Format(moteur1.PPure_ScenCentral, "###,##0.0000 %")
        Else
            PtiC_Lbl_coutRisqueMut.Text = "-"
        End If

    End Sub
    Private Sub refreshScCentSPrisqueMut()

        Dim moteur1 As moteurTauxGaranti1.Moteur_Methode1 = _universBDD.listeTraitements.getTraitMoteurMethode1
        If moteur1.etatCalculScenCentral = valueEtatCalcul.A_JOUR Then
            PtiC_Lbl_SPRisqueMut.Text = Format(moteur1.ratioSP_scenCentral, "###,##0.0 %")
        Else
            PtiC_Lbl_SPRisqueMut.Text = "-"
        End If

    End Sub
    Private Sub refreshScCentPrimeRisqueMutualisee()

        Dim moteur1 As moteurTauxGaranti1.Moteur_Methode1 = _universBDD.listeTraitements.getTraitMoteurMethode1
        If moteur1.etatCalculScenCentral = valueEtatCalcul.A_JOUR Then
            PtiC_Lbl_primeRisqueMut.Text = Format(moteur1.PTechPf_ScenCentral, "###,##0.0000 %")
        Else
            PtiC_Lbl_primeRisqueMut.Text = "-"
        End If

    End Sub
    Private Sub refreshScCentChargementTech()

        Dim moteur1 As moteurTauxGaranti1.Moteur_Methode1 = _universBDD.listeTraitements.getTraitMoteurMethode1
        If moteur1.etatCalculScenCentral = valueEtatCalcul.A_JOUR Then
            PtiC_LabelChtTech.Text = Format(1 - moteur1.ratioSP_scenCentral, "###,##0.0 %")
        Else
            PtiC_LabelChtTech.Text = "-"
        End If

    End Sub
#End Region
#Region "La gauge"
    Private Sub refreshScCentGaugeSP()

        ''Me.PtiC_TableLayoutPanelResScenCent.SetRowSpan(Me.PtiC_PanelGpeBoxResScenMut, 2)
        ''PtiC_PanelGpeBoxSPscenCent.Visible = True

        Dim zgc As ZedGraph.ZedGraphControl = ZedGraphGauge
        Dim SP_scenCentral As Double = _universBDD.listeTraitements.getTraitMoteurMethode1.ratioSP_scenCentral

        Dim myPane As ZedGraph.GraphPane = zgc.GraphPane
        myPane.CurveList.Clear()
        'myPane.

        'Définition du titre
        ''myPane.Title.Text = "Ratio S/P espéré"
        ''myPane.Title.FontSpec.Size = 18
        myPane.Title.IsVisible = False
        myPane.Border.IsVisible = False

        'Remplissage du graph en gris
        ''master.Fill.Color = ()
        myPane.Fill = New ZedGraph.Fill(Color.White)
        'Fond en dégradé de bleu
        'myPane.Chart.Fill = New ZedGraph.Fill(Color.White, Color.SkyBlue, 45.0F)

        'Pas d'affichage des axes pour la jauge
        myPane.XAxis.IsVisible = False
        myPane.Y2Axis.IsVisible = False
        myPane.YAxis.IsVisible = False

        myPane.Legend.Position = ZedGraph.LegendPos.BottomCenter
        myPane.Legend.FontSpec.Size = 18

        'Define needles; can add more than one
        Dim coord As Double = 0
        If SP_scenCentral >= 1.5 Then
            coord = 0
        ElseIf SP_scenCentral <= 0.5 Then
            coord = 100
        Else
            coord = 150 - SP_scenCentral * 100
        End If
        Dim gg1 As ZedGraph.GasGaugeNeedle = New ZedGraph.GasGaugeNeedle("Scénario central", coord, Color.Black)
        myPane.CurveList.Add(gg1)
        'Define all regions
        Dim ggr1 As New ZedGraph.GasGaugeRegion("Dangereux", 0, 55, Color.Red)
        Dim ggr2 As New ZedGraph.GasGaugeRegion("Acceptable", 55, 70, Color.Yellow)
        Dim ggr3 As New ZedGraph.GasGaugeRegion("Idéal", 70, 100, Color.Green)
        'Add the curves
        myPane.CurveList.Add(ggr1)
        myPane.CurveList.Add(ggr2)
        myPane.CurveList.Add(ggr3)

        myPane.Chart.Border.IsVisible = False
        myPane.Chart.Fill.Color = Color.White
        myPane.Chart.Fill.Type = ZedGraph.FillType.Solid
        myPane.Legend.Border.IsVisible = False
        myPane.Legend.Fill.Color = Color.White
        myPane.Legend.Fill.Type = ZedGraph.FillType.Solid

        zgc.AxisChange()

    End Sub

#End Region
#Region "Le taux de com"
    Private Sub refreshScCentValeurUniqueTxCom(ByVal valeurUnique As String)
        txt_Param8.value = valeurUnique
    End Sub
#End Region
#Region "La table des calculs détaillés"
    Private Sub refreshScCentTableTravDetaillee()
        dgv_tbleTravail.DataSource = _universBDD.listeTraitements.getTraitMoteurMethode1.tableTravail
        MAJdgvFormats(_universBDD.listeTraitements.getTraitTbleEncours.ListeChampsSortie, dgv_tbleTravail)
        dgv_tbleTravail.Columns(nomPComDC_Non_Derog_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomPComDC_Non_Derog_Actu).HeaderText = descPComDC_Non_Derog_Actu
        dgv_tbleTravail.Columns(nomPComDC_Derog_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomPComDC_Derog_Actu).HeaderText = descPComDC_Derog_Actu
        dgv_tbleTravail.Columns(nomPourDC_Derog_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomPourDC_Derog_Actu).HeaderText = descPourDC_Derog_Actu
        dgv_tbleTravail.Columns(nomPComINCINV_Non_Derog_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomPComINCINV_Non_Derog_Actu).HeaderText = descPComDC_Non_Derog_Actu
        dgv_tbleTravail.Columns(nomPComINCINV_Derog_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomPComINCINV_Derog_Actu).HeaderText = descPComINCINV_Derog_Actu
        dgv_tbleTravail.Columns(nomPourINCINV_Derog_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomPourINCINV_Derog_Actu).HeaderText = descPourINCINV_Derog_Actu
        dgv_tbleTravail.Columns(nomTxMort_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomTxMort_Actu).HeaderText = descTxMort_Actu
        dgv_tbleTravail.Columns(nomTxNom_Actu).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomTxNom_Actu).HeaderText = descTxNom_Actu

        dgv_tbleTravail.Columns(nomTx_abat_ExclPerteRev).DefaultCellStyle.Format = "###,##0 %"
        dgv_tbleTravail.Columns(nomTx_abat_ExclPerteRev).HeaderText = descTx_abat_ExclPerteRev

        dgv_tbleTravail.Columns(nomTx_abat_MalaNonObje).DefaultCellStyle.Format = "###,##0 %"
        dgv_tbleTravail.Columns(nomTx_abat_MalaNonObje).HeaderText = descTx_abat_MalaNonObje

        dgv_tbleTravail.Columns(nomTx_chgtSecuINCINV).DefaultCellStyle.Format = "###,##0 %"
        dgv_tbleTravail.Columns(nomTx_chgtSecuINCINV).HeaderText = descTx_chgtSecuINCINV

        dgv_tbleTravail.Columns(nomTx_fraiGestA).DefaultCellStyle.Format = "###,##0.00 %"
        dgv_tbleTravail.Columns(nomTx_fraiGestA).HeaderText = descTx_fraiGestA

        dgv_tbleTravail.Columns(nomAge_FinDC).HeaderText = descAge_FinDC
        dgv_tbleTravail.Columns(nomAge_FinINCINV).HeaderText = descAge_FinINCINV
        dgv_tbleTravail.Columns(nomTx_mensEntreeINCINV).HeaderText = descTx_mensEntreeINCINV
        dgv_tbleTravail.Columns(nomTx_mensEntreeINCINV).DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns(nomTx_TechA).HeaderText = descTx_TechA
        dgv_tbleTravail.Columns(nomTx_TechA).DefaultCellStyle.Format = "###,##0.000 %"

        dgv_tbleTravail.Columns("PP_DC").DefaultCellStyle.Format = "###,##0.00000 %"
        dgv_tbleTravail.Columns("PP_DC").HeaderText = "Prime pure décès"
        dgv_tbleTravail.Columns("PP_INCINV").DefaultCellStyle.Format = "###,##0.00000 %"
        dgv_tbleTravail.Columns("PP_INCINV").HeaderText = "Prime pure INC/INV"
        dgv_tbleTravail.Columns("PP_SEGMENT").DefaultCellStyle.Format = "###,##0.00000 %"
        dgv_tbleTravail.Columns("PP_SEGMENT").HeaderText = "Prime pure du segment"
        dgv_tbleTravail.Columns("PTECH_SEGMENT").DefaultCellStyle.Format = "###,##0.000 %"
        dgv_tbleTravail.Columns("PTECH_SEGMENT").HeaderText = "Prime technique du segment"
        dgv_tbleTravail.Columns("POIDS_CSR").DefaultCellStyle.Format = "###,##0.0 %"
        dgv_tbleTravail.Columns("POIDS_CSR").HeaderText = "Répartition des capitaux sous risque"
        dgv_tbleTravail.Columns("AGESOUS_ACTU").HeaderText = "Age actuariel à la souscription"
        dgv_tbleTravail.Columns(nomDuree_Actu).HeaderText = descDuree_Actu
        dgv_tbleTravail.Columns(nomtrAge).HeaderText = desctrAge
        dgv_tbleTravail.Columns(nomSumCapIni).HeaderText = descSumCapIni
        dgv_tbleTravail.Columns(nomNbPretsXassu).HeaderText = descNbPretsXassu
    End Sub
#End Region
#End Region
#Region "Rafraichissement des onglets liés aux simulations"
    Private Sub MAJ_graphsSensibilites()

        Try

            If _universBDD.listeTraitements.getTraitMoteurMethode1.etatCalculSimulations = valueEtatCalcul.A_JOUR Then

                'Déclaration du conteneur de graphique et nettoyage des éventuels graphs existants dans la collection
                Dim master As ZedGraph.MasterPane = ZedGraphControlSensibilites.MasterPane
                master.PaneList.Clear()

                'Affichage du titre et paramétrage de la marge extérieure à 10 pixels
                master.Title.IsVisible = True
                master.Title.Text = "Tests de sensibilité autour du scénario central"
                master.Margin.All = 10

                'Création des graphiques des sensibilités

                'Choc sur le taux technique
                Dim GpaneChocTxTech As New ZedGraph.GraphPane()
                Dim ligneTxTech As ZedGraph.LineItem
                Dim listTxTech As ZedGraph.PointPairList = tbleSimulToPointPairList(csteParam.nomTx_TechA, 100)
                If Not listTxTech Is Nothing Then
                    ligneTxTech = GpaneChocTxTech.AddCurve("Simulation durée actuarielle", listTxTech, Color.Blue, ZedGraph.SymbolType.Diamond)
                End If

                miseEnFormeGraph(GpaneChocTxTech, "Choc sur le taux technique", _
                            "Choc en nombre de points par rapport au scénario central", "Espérance du S/P", 24)
                GpaneChocTxTech.YAxis.Scale.Format = "###,##0.0 %"


                'Choc sur la durée des prêts en mois
                Dim GpaneChocDuree As New ZedGraph.GraphPane()
                miseEnFormeGraph(GpaneChocDuree, "Choc sur les durées initiales", _
                                    "Choc en nombre de mois", "Espérance du S/P", 24)
                Dim listDuree As ZedGraph.PointPairList = tbleSimulToPointPairList(nomDuree_Actu, 1)
                If Not listDuree Is Nothing Then
                    GpaneChocDuree.AddCurve("Simulation durée actuarielle", listDuree, Color.Violet, ZedGraph.SymbolType.Diamond)
                End If

                'Choc sur le taux nominal
                Dim GpaneChocTxNom As New ZedGraph.GraphPane()
                miseEnFormeGraph(GpaneChocTxNom, "Choc sur les taux nominaux", _
                                    "Choc en nombre de points par rapport au scénario central", "Espérance du S/P", 24)
                Dim listTxNom As ZedGraph.PointPairList = tbleSimulToPointPairList(nomTxNom_Actu, 100)
                If Not listTxNom Is Nothing Then
                    GpaneChocTxNom.AddCurve("Simulation durée actuarielle", listTxNom, Color.Orange, ZedGraph.SymbolType.Diamond)
                End If

                'Choc sur une variation de la commission contractante
                Dim GpaneChocCommiContA As New ZedGraph.GraphPane()
                miseEnFormeGraph(GpaneChocCommiContA, "Evolution du S/P en fonction du taux garanti", _
                                    "Choc en nombre de points sur le taux garanti", "Espérance du S/P", 18)
                Dim listTx_CommiContA As ZedGraph.PointPairList = tbleSimulToPointPairList(csteParam.nomTx_CommiContA, 100)
                If Not listTx_CommiContA Is Nothing Then
                    GpaneChocCommiContA.AddCurve("Simulation taux garanti", listTx_CommiContA, Color.Red, ZedGraph.SymbolType.Diamond)
                End If

                'Choc sur une variation des frais de gestion
                Dim GpaneChocFG As New ZedGraph.GraphPane()
                miseEnFormeGraph(GpaneChocFG, "Evolution du S/P en des frais de gestion", _
                                    "Choc en nombre de points sur les frais de gestion", "Espérance du S/P", 18)
                Dim listTx_fraiGestA As ZedGraph.PointPairList = tbleSimulToPointPairList(csteParam.nomTx_fraiGestA, 100)
                If Not listTx_fraiGestA Is Nothing Then
                    GpaneChocFG.AddCurve("Simulation taux garanti", listTx_fraiGestA, Color.Green, ZedGraph.SymbolType.Diamond)
                End If

                'Ajout de tous les graphiques dans le conteneur
                master.Add(GpaneChocTxTech)
                master.Add(GpaneChocDuree)
                master.Add(GpaneChocTxNom)
                master.Add(GpaneChocCommiContA)
                master.Add(GpaneChocFG)

                master.Fill.Color = (Color.FromArgb(245, 235, 255))

                'Réinitialisation des axes des graphiques du conteneur
                ZedGraphControlSensibilites.AxisChange()

                'Définition de la mise en page
                Dim g As Graphics = Me.CreateGraphics
                master.SetLayout(g, ZedGraph.PaneLayout.ExplicitRow32)

                Invalidate()
            End If

        Catch ex As Exception
        End Try

    End Sub
    Private Sub MAJ_graphsStressTests()

        Try

            If Not _moteurCalcul.etatCalculSimulations = valueEtatCalcul.NON_INITIALISE Then

                'Déclaration du conteneur de graphique et nettoyage des éventuels graphs existants dans la collection
                Dim master As ZedGraph.MasterPane = ZedGraphControlStressTests.MasterPane
                master.PaneList.Clear()

                'Affichage du titre et paramétrage de la marge extérieure à 10 pixels
                master.Title.IsVisible = True
                master.Title.Text = "Stress-Tests autour du scénario central"
                master.Margin.All = 10

                'Stress-Test sur la proportion des prêts immobiliers
                Dim GpaneTestImmo As New ZedGraph.GraphPane()
                miseEnFormeGraph(GpaneTestImmo, "Stress-Test : Choc sur les CSR des prêts immobiliers", _
                                    "Augmentation des CSR des prêts immo (en %)", "Espérance du S/P", 20)
                Dim listImmo As ZedGraph.PointPairList = tbleSimulToPointPairList("ST_Immo", 100)
                If Not listImmo Is Nothing Then
                    GpaneTestImmo.AddCurve("Simulation Proprortion Immo", listImmo, Color.Blue, ZedGraph.SymbolType.Diamond)
                End If


                Dim GpaneTestTrAge As New ZedGraph.GraphPane()
                miseEnFormeGraph(GpaneTestTrAge, "Stress-Test : choc sur les CSR de la tranche d'âge la plus âgée", _
                                    "Augmentation des CSR de la tranche d'âge la plus âgée (en %)", "Espérance du S/P", 20)
                Dim listTrAge As ZedGraph.PointPairList = tbleSimulToPointPairList("ST_Tr_age", 100)
                If Not listTrAge Is Nothing Then
                    GpaneTestTrAge.AddCurve("Simulation Proprortion Tr_AgeC", listTrAge, Color.Red, ZedGraph.SymbolType.Diamond)
                End If


                master.Add(GpaneTestImmo)
                master.Add(GpaneTestTrAge)
                master.Fill.Color = (Color.FromArgb(245, 235, 255))

                'Définition de la mise en page
                Dim g As Graphics = Me.CreateGraphics
                master.SetLayout(g, ZedGraph.PaneLayout.SingleColumn)

                ZedGraphControlStressTests.AxisChange()

                Refresh()

            End If

        Catch ex As Exception
        End Try

    End Sub
    Private Sub MAJ_spiderGraph()

        Try

            If _moteurCalcul.etatCalculSimulations = valueEtatCalcul.A_JOUR Then


                'Ici on récupère l'objet lié au graphique
                Dim myPane As ZedGraph.GraphPane

                'Le nombre d'axes
                Dim nbAxes As Integer = 6
                'Le rayon
                Dim rayon As Double = 4.0

                'Ici on applique un fond dégradé
                myPane = ZedGraphControlRadar.GraphPane
                myPane.CurveList.Clear()
                ''myPane.Chart.Fill = New ZedGraph.Fill(Color.FromArgb(255, 255, 245), Color.FromArgb(255, 255, 190), 90.0F)
                myPane.Chart.Fill = New ZedGraph.Fill(Color.White)
                myPane.Title.Text = "Synthèse de la sensibilité de l'espérance du S/P autour du scénario central"
                myPane.XAxis.Title.Text = ""



                Dim rand As New Random()

                Dim myColors As Object() = {Color.Green, Color.Blue, Color.Red, Color.Yellow, Color.YellowGreen, _
                                            Color.Wheat, Color.WhiteSmoke, Color.AntiqueWhite, Color.DarkOliveGreen, _
                                            Color.Beige}
                Dim labels As String() = {"Frais de gestion +1 pt", "Durée +1 an", "Tx Tech +1 pt", "CSR tranche C +10 %", _
                                          "CSR prêts immo +10 %", "Tx Nominaux +1 pt"}

                'Ici on crée les axes du radar en abscisse
                For j As Integer = 0 To nbAxes - 1
                    Dim list As New ZedGraph.PointPairList
                    'L'angle théta en radians
                    Dim theta As Double = (2.0 * Math.PI * j / nbAxes) + Math.PI / 2
                    'Conversion des coordonnées polaires en cartésiennes
                    Dim x As Double = rayon * Math.Cos(theta)
                    Dim y As Double = rayon * Math.Sin(theta)
                    list.Add(0.0, 0.0)
                    list.Add(x, y)
                    Dim li As ZedGraph.LineItem = myPane.AddCurve("", list, Color.Black, ZedGraph.SymbolType.None)
                    'Création d'un label
                    'Décalage du texte (selon que l'axe appartient à l'hémisphère nord ou sud du radar)
                    Dim emplacementTxtX As Double = x + 0.11 * Math.Cos(theta)
                    Dim emplacementTxtY As Double = IIf(theta < Math.PI Or theta > Math.PI * 2, y + 0.4 * Math.Sin(theta), y - (1.25 / 8) * rayon)

                    Dim text As ZedGraph.TextObj = New ZedGraph.TextObj( _
                                         labels(j), _
                                         emplacementTxtX, _
                                         emplacementTxtY, _
                                         ZedGraph.CoordType.AxisXYScale, _
                                         ZedGraph.AlignH.Center, _
                                         ZedGraph.AlignV.Bottom)
                    text.ZOrder = ZedGraph.ZOrder.A_InFront
                    Dim legFontSpec As ZedGraph.FontSpec
                    legFontSpec = New ZedGraph.FontSpec("Tahoma", 10, Color.Black, False, False, False, Color.White, Nothing, ZedGraph.FillType.Brush)
                    legFontSpec.Border.IsVisible = False
                    legFontSpec.Fill.IsVisible = False
                    text.FontSpec = legFontSpec
                    myPane.GraphObjList.Add(text)
                Next


                'Ici on crée les axes du radar en ordonnées
                'et les quadrillages des axes
                For i As Integer = 0 To CInt(rayon) - 1

                    ''Dim list As New ZedGraph.PointPairList

                    For j As Integer = 0 To nbAxes - 1

                        Dim listGraduation As New ZedGraph.PointPairList
                        Dim theta As Double = (2.0 * Math.PI * j / nbAxes) + Math.PI / 2
                        Dim r2 As Double = 1.0 + i
                        Dim x As Double = r2 * Math.Cos(theta)
                        Dim y As Double = r2 * Math.Sin(theta)
                        Dim coeffDirAxe As Double = Math.Sin(theta) / Math.Cos(theta)

                        'On cherche les coordonnées de la droite perpendiculaire à (theta,r2)
                        'Formule sur les coefficients directeurs de 2 droites parallèles
                        Dim coeffDirQuadrillage = -(Me.Width / Me.Height) / (coeffDirAxe)
                        'On sait que la droite pass par x,y
                        Dim Bquadrillage As Double = y - coeffDirQuadrillage * x

                        'Selon la longueur souhaité des marques du quadrillage, résolution d'une équation du 2nd degré
                        Dim d As Double = (0.01) * nbAxes
                        Dim a As Double = coeffDirQuadrillage ^ 2 + 1
                        Dim b As Double = 2 * (coeffDirQuadrillage * (Bquadrillage - y) - x)
                        Dim c As Double = x ^ 2 + (Bquadrillage - y) ^ 2 - d ^ 2

                        Dim delta As Double = b ^ 2 - 4 * a * c

                        Dim x1 As Double = (-b + Math.Sqrt(delta)) / (2 * a)
                        Dim y1 As Double = coeffDirQuadrillage * x1 + Bquadrillage

                        Dim x2 As Double = (-b - Math.Sqrt(delta)) / (2 * a)
                        Dim y2 As Double = coeffDirQuadrillage * x2 + Bquadrillage

                        listGraduation.Add(x1, y1)
                        listGraduation.Add(x2, y2)

                        myPane.AddCurve("", listGraduation, Color.Black, ZedGraph.SymbolType.None)

                        ''list.Add(x, y)
                    Next

                    'On duplique le premier point pour fermer le cercle
                    ''list.Add(list(0))
                    ''myPane.AddCurve("", list, Color.Transparent, ZedGraph.SymbolType.Diamond)

                    'Legende de l'axe (points de variation du taux garanti)
                    Dim text As New ZedGraph.TextObj((i + 1).ToString(), 0 + 0.1, (i + 1), _
                                                     ZedGraph.CoordType.AxisXYScale, ZedGraph.AlignH.Left, _
                                                     ZedGraph.AlignV.Center)
                    text.ZOrder = ZedGraph.ZOrder.A_InFront
                    'Cache la bordure et le contenu
                    text.FontSpec.Size = 10
                    text.FontSpec.Border.IsVisible = False
                    text.FontSpec.Fill.IsVisible = False
                    myPane.GraphObjList.Add(text)
                Next

                'Récupération de la série résultant des simulations
                For i As Integer = 0 To 0

                    Dim list As ZedGraph.PointPairList = New ZedGraph.PointPairList

                    'Chaque contour récupère un point
                    '(dans le cas d'OMANE nous n'auront qu'une seule série)
                    Dim tabPointSimul() As String = New String() _
                        {csteParam.nomTx_fraiGestA, nomDuree_Actu, csteParam.nomTx_TechA, "ST_Tr_age", "ST_Immo", nomTxNom_Actu}
                    For j = 0 To nbAxes - 1
                        Dim theta As Double = (2.0 * Math.PI * j / nbAxes) + Math.PI / 2
                        Dim r2 As Double = Math.Abs(_moteurCalcul.simulations.SimulRadar.Item(tabPointSimul(j)) - _moteurCalcul.ratioSP_scenCentral) * 100
                        Dim x As Double = r2 * Math.Cos(theta)
                        Dim y As Double = r2 * Math.Sin(theta)
                        list.Add(x, y)
                    Next
                    'On ajoute le dernier point pour fermer la boucle
                    list.Add(list(0))
                    Dim myCurve As ZedGraph.LineItem = myPane.AddCurve("Synthèse des sensibilités", list, _
                                                       Color.Black, ZedGraph.SymbolType.None)
                    ''myCurve.Line.Fill = New ZedGraph.Fill(CType(myColors(i), Color), Color.White)
                    myCurve.Line.Fill = New ZedGraph.Fill(CType(myColors(i), Color))

                Next


                myPane.Legend.IsVisible = False
                ''myPane.Fill = New ZedGraph.Fill(Color.White, Color.LightGoldenrodYellow, 45.0F)
                myPane.Fill = New ZedGraph.Fill(Color.FromArgb(245, 235, 255))

                'myPane.YAxis.Scale.Min = -5
                'myPane.YAxis.Scale.Max = 5
                'myPane.XAxis.Scale.Min = -7
                'myPane.XAxis.Scale.Max = 7

                myPane.XAxis.MajorGrid.IsVisible = False
                myPane.XAxis.MinorGrid.IsVisible = False
                myPane.YAxis.MajorGrid.IsVisible = False
                myPane.YAxis.MinorGrid.IsVisible = False

                myPane.XAxis.Scale.IsVisible = False
                myPane.YAxis.Scale.IsVisible = False

                myPane.XAxis.IsVisible = False
                myPane.YAxis.IsVisible = False

                myPane.AxisChange()


                Me.Invalidate()
                Refresh()
            End If

        Catch
        End Try
    End Sub
    Private Function tbleSimulToPointPairList(ByVal nomParam As String, ByVal mult As Double) As ZedGraph.PointPairList

        Dim list As ZedGraph.PointPairList = Nothing
        Dim tbleResultatSimul As DataTable = Nothing

        Select Case nomParam
            Case nomTx_TechA
                tbleResultatSimul = _moteurCalcul.simulations.SimulTx_TechA.resultats
            Case nomDuree_Actu
                tbleResultatSimul = _moteurCalcul.simulations.SimulDuree_Actu.resultats
            Case nomTx_CommiContA
                tbleResultatSimul = _moteurCalcul.simulations.SimulTx_CommiContA.resultats
            Case nomTx_fraiGestA
                tbleResultatSimul = _moteurCalcul.simulations.SimulTx_fraiGestA.resultats
            Case nomTxNom_Actu
                tbleResultatSimul = _moteurCalcul.simulations.SimulTxNom_Actu.resultats
            Case "ST_Immo"
                tbleResultatSimul = _moteurCalcul.simulations.SimulST_Immo.resultats
            Case "ST_Tr_age"
                tbleResultatSimul = _moteurCalcul.simulations.SimulST_Tr_age.resultats
        End Select


        If Not tbleResultatSimul Is Nothing Then

            list = New ZedGraph.PointPairList()

            For Each r As DataRow In tbleResultatSimul.Rows
                list.Add(r(nomParam) * mult, r("S/P"))
            Next

        End If

        Return list

    End Function
#End Region
#End Region

#End Region

End Class